package com.etoak.controller;

import cn.hutool.core.io.file.FileNameUtil;
import cn.hutool.core.util.IdUtil;
import cn.hutool.core.util.StrUtil;
import com.etoak.common.core.exception.CustomException;
import com.etoak.common.core.properties.ImageProperties;
import com.etoak.common.core.vo.ResultVO;
import org.apache.commons.lang3.ObjectUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.web.multipart.MultipartFile;

import java.io.File;
import java.io.IOException;
import java.util.stream.Collectors;

@RestController
@RequestMapping("/upload")
public class UploadController {

    @Autowired
    ImageProperties imageProperties; // 来自cloude-common.common-core

    @PostMapping("/image")
    public ResultVO<String> upload(MultipartFile pic) throws IOException {
        /**
         * ObjectUtils 的依赖来源？
         * 依赖路径分析：
         * upload-service 依赖了 common-web
         * common-web 依赖了 spring-boot-starter-web
         * spring-boot-starter-web 间接包含了 Apache Commons Lang3
         */
        if (ObjectUtils.isEmpty(pic) || pic.isEmpty()) {
            throw new CustomException("文件不能为空！");
        }

        if (!imageProperties.getTypes().contains(pic.getContentType())) {
            // types = ["image/png", "image/jpeg"]
            /**
             * 解释代码：
             * imageProperties.getTypes() - 获取配置的图片类型列表，可能包含类似 ["image/jpeg", "image/png",
             * "image/gif"] 这样的MIME类型
             * .stream() - 将列表转换为流，以便进行函数式处理
             * .map(str -> str.substring(str.lastIndexOf("/") + 1)) - 对每个字符串进行处理：
             * str.lastIndexOf("/") 找到最后一个"/"的位置
             * + 1 跳过"/"字符
             * substring() 提取"/"后面的部分
             * 例如："image/jpeg" → "jpeg"，"image/png" → "png"
             * .collect(Collectors.joining("、")) - 将处理后的字符串用"、"连接起来
             * 最终结果示例：
             * 输入：["image/jpeg", "image/png", "image/gif"]
             * 输出："jpeg、png、gif"
             */
            String types = imageProperties.getTypes().stream()
                    .map(str -> str.substring(str.lastIndexOf("/") + 1))
                    .collect(Collectors.joining("、"));
            throw new CustomException("仅支持 " + types + " 类型的图片！");
        }

        // 新的图片文件名称    IdUtil、FileNameUtil来自糊涂包     getOriginalFilename()是MultipartFile中的方法
        //getSuffix(..)获取文件后缀名，并且不带'.'
        String filename = IdUtil.simpleUUID() + "." + FileNameUtil.getSuffix(pic.getOriginalFilename());

        /* 上传目录
         * 这个上传目录是nacos中配置的
         */
        File uploadDir = new File(imageProperties.getUploadDir());
        if (!uploadDir.exists()) {
            uploadDir.mkdirs(); //如果不存在上传目录就建一个
        }

        // 目标文件  File第一个参数是父目录，第二个参数是文件名字，做拼接 =》父目录/文件名
        File destFile = new File(uploadDir, filename);
        // 上传文件 transferTo 是 MultipartFile中的方法，作用是将pic这个图片保存到destFile这个文件中
        pic.transferTo(destFile);

        // 请求地址  /pics/文件名  =》返回给前端的内容
        /**
         * getMapping() =》nacos中配置的/pics
         */
        String path = imageProperties.getMapping().endsWith("/") ? imageProperties.getMapping() + filename
                : imageProperties.getMapping() + "/" + filename;
        return ResultVO.success(path);
    }
}
